/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import model.Funcionario;
import utils.Conexao;
import utils.ExcecaoSCEV;
import utils.TrataData;

public class FuncionarioDAO {

        public List<Funcionario> pegarTodos() throws ExcecaoSCEV {
        List<Funcionario> Funcionarios = new ArrayList<Funcionario>();
        Funcionario umFuncionario;

        try {

            Connection db = Conexao.getConnection();
            Statement st = (Statement) db.createStatement();
            ResultSet rs = st.executeQuery("SELECT cod_funcionario,nome," +
                    "cod_sexo,datanascimento,identidade," +
                    "cpf,ctps,logradouro,numero,complemento,bairro,cidade," +
                    "uf,cep,email,tel_residencial,orgao_expedidor_ident,uf_ident FROM funcionario");
            while (rs.next()) {
                umFuncionario = new Funcionario() {};
                umFuncionario.setCodigoFuncionario(rs.getInt(1));
                umFuncionario.setNome(rs.getString(2));
                umFuncionario.setSexo(rs.getString(3));
                umFuncionario.setDataNascimento(rs.getString(4));
                umFuncionario.setIdentidade(rs.getString(5));
                umFuncionario.setCpf(rs.getString(6));
                umFuncionario.setCtps(rs.getString(7));
                umFuncionario.setLogradouro(rs.getString(8));
                umFuncionario.setNumero(rs.getString(9));
                umFuncionario.setComplemento(rs.getString(10));
                umFuncionario.setBairro(rs.getString(11));
                umFuncionario.setCidade(rs.getString(12));
                umFuncionario.setUf(rs.getString(13));
                umFuncionario.setCep(rs.getString(14));
                umFuncionario.setEmail(rs.getString(15));
                umFuncionario.setTelResidencial(rs.getString(16));
                umFuncionario.setOrgaoExpedidor(rs.getString(17));
                umFuncionario.setUfIdentidade(rs.getString(18));
                 
                Funcionarios.add(umFuncionario);
            }
            rs.close();
          

        } catch (SQLException ex) {
            throw new ExcecaoSCEV("Erro ao listar os Funcionarios. Código " +
                    ex.getSQLState() +
                    "\nDescricao " +
                    ex.getMessage());
        }
        return Funcionarios;
    }

    public void incluir(Funcionario Funcionario) throws ExcecaoSCEV {
        try {
            Connection db = Conexao.getConnection();
            PreparedStatement st =
                    db.prepareStatement("insert into funcionario (" +
                    "cod_funcionario,nome,identidade,cpf,ctps,cod_sexo," +
                    "datanascimento,logradouro,numero,complemento,bairro," +
                    "cidade,uf,cep,email,tel_residencial,orgao_expedidor_ident," +
                    "uf_ident) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");

            st.setInt(1,  Funcionario.getCodigoFuncionario());
            st.setString(2,  Funcionario.getNome());
            st.setString(3,  Funcionario.getIdentidade());
            st.setString(4,  Funcionario.getCpf());
            st.setString(5,  Funcionario.getCtps());
            st.setString(6,  Funcionario.getSexo());
            st.setDate(7, TrataData.strToDate(Funcionario.getDataNascimento()));
            st.setString(8,  Funcionario.getLogradouro());
            st.setString(9,  Funcionario.getNumero());
            st.setString(10, Funcionario.getComplemento());
            st.setString(11, Funcionario.getBairro());
            st.setString(12, Funcionario.getCidade());
            st.setString(13, Funcionario.getUf());
            st.setString(14, Funcionario.getCep());
            st.setString(15, Funcionario.getEmail());
            st.setString(16, Funcionario.getTelResidencial());
            st.setString(17, Funcionario.getOrgaoExpedidor());
            st.setString(18, Funcionario.getUfIdentidade());
            st.executeUpdate();
            st.close();
        } catch (SQLException ex) {
            if (ex.getSQLState().equals("23505")) {
                throw new ExcecaoSCEV("Funcionario duplicado.");
            } else {
                throw new ExcecaoSCEV("Erro na inclusão do Funcionario. Código " +
                        ex.getSQLState() +
                        "\nDescricao " +
                        ex.getMessage());
            }
        }

    }

    public void alterar(Funcionario Funcionario) throws ExcecaoSCEV {
        try {
            Connection db = Conexao.getConnection();
            PreparedStatement st =
                    db.prepareStatement("update funcionario set cod_funcionario=?," +
                    "nome=?,identidade=?,cpf=?,ctps=?,cod_sexo=?," +
                    "datanascimento=?,logradouro=?," +
                    "numero=?,complemento=?,bairro=?,cidade=?,uf=?,cep=?,email=?," +
                    "tel_residencial=?,orgao_expedidor_ident=?,uf_ident=? where cod_funcionario =?");

            st.setInt(1,  Funcionario.getCodigoFuncionario());
            st.setString(2,  Funcionario.getNome());
            st.setString(3,  Funcionario.getIdentidade());
            st.setString(4,  Funcionario.getCpf());
            st.setString(5,  Funcionario.getCtps());
            st.setString(6,  Funcionario.getSexo());
            st.setDate(7, TrataData.strToDate(Funcionario.getDataNascimento()));
            st.setString(8,  Funcionario.getLogradouro());
            st.setString(9,  Funcionario.getNumero());
            st.setString(10, Funcionario.getComplemento());
            st.setString(11, Funcionario.getBairro());
            st.setString(12, Funcionario.getCidade());
            st.setString(13, Funcionario.getUf());
            st.setString(14, Funcionario.getCep());
            st.setString(15, Funcionario.getEmail());
            st.setString(16, Funcionario.getTelResidencial());
            st.setString(17, Funcionario.getOrgaoExpedidor());
            st.setString(18, Funcionario.getUfIdentidade());
            st.setInt(19,  Funcionario.getCodigoFuncionario());
            st.executeUpdate();
            st.close();

            st = db.prepareStatement("SELECT cod_funcionario FROM funcionario where cod_funcionario = ?");
            st.setInt(1, Funcionario.getCodigoFuncionario());
            ResultSet rs = st.executeQuery();
            rs.next();
	    String CodigoFuncionario = rs.getString(1);
      	    rs.close();
	    st.close();

        } catch (SQLException ex) {
            throw new ExcecaoSCEV("Erro na alteração do Funcionario.  Código " +
                    ex.getSQLState() +
                    "\nDescricao " +
                    ex.getMessage());
        }
    }

    public void excluir(Funcionario Funcionario) throws ExcecaoSCEV {
        try {
            Connection db = Conexao.getConnection();
            PreparedStatement st =
                    db.prepareStatement("delete from Funcionario where cod_funcionario = ? ");
            st.setInt(1, Funcionario.getCodigoFuncionario());
            st.executeUpdate();
            st.close();
        } catch (SQLException ex) {
            if (ex.getSQLState().equals("23503")) {
                throw new ExcecaoSCEV("Erro na exclusão do Funcionario.  Código " +
                        ex.getSQLState() +
                        "\nDescricao " +
                        ex.getMessage());
            }
        }
    }

    public void carregar(Funcionario Funcionario) throws ExcecaoSCEV {

        try {
            Connection db = Conexao.getConnection();
            PreparedStatement st =
                    db.prepareStatement("SELECT cod_funcionario," +
                    "nome,identidade,cpf,ctps,cod_sexo,datanascimento," +
                    "logradouro,numero,complemento," +
                    "bairro,cidade,uf,cep,email,tel_residencial," +
                    "orgao_expedidor_ident,uf_ident FROM Funcionario where cod_Funcionario = ?");
            st.setInt(1, Funcionario.getCodigoFuncionario());
            ResultSet rs = st.executeQuery();

            if (rs.next()) {
                
                Funcionario.setCodigoFuncionario(rs.getInt(1));
                Funcionario.setNome(rs.getString(2));
                Funcionario.setIdentidade(rs.getString(3));
                Funcionario.setCpf(rs.getString(4));
                Funcionario.setCtps(rs.getString(5));
                Funcionario.setSexo(rs.getString(6));
                Funcionario.setDataNascimento(TrataData.dateToStr(rs.getDate(7)));
                Funcionario.setLogradouro(rs.getString(8));
                Funcionario.setNumero(rs.getString(9));
                Funcionario.setComplemento(rs.getString(10));
                Funcionario.setBairro(rs.getString(11));
                Funcionario.setCidade(rs.getString(12));
                Funcionario.setUf(rs.getString(13));
                Funcionario.setCep(rs.getString(14));
                Funcionario.setEmail(rs.getString(15));
                Funcionario.setTelResidencial(rs.getString(16));
                Funcionario.setOrgaoExpedidor(rs.getString(17));
                Funcionario.setUfIdentidade(rs.getString(18));

            }

            rs.close();
        } catch (SQLException ex) {
            throw new ExcecaoSCEV("Erro ao carregar um Funcionario. Código " + ex.getSQLState() +
                    "\nDescricao " + ex.getMessage());
        }

    }
}
     

